package com.heima.user.controller;

import com.heima.models.users.Test;
import com.heima.user.mapper.TestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.*;
import org.springframework.data.redis.connection.RedisGeoCommands;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@RequestMapping("geo")
public class GeoController {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    private TestMapper testMapper;

    /**
     * 添加经纬度到Redis，这个方法由前端定时调用，保证用户坐标是最新的
     *
     * @return String
     */
    @GetMapping("add/location")
    public String addPoint() {
        // 1. 通过ThreadLocal获取当前用户的id
        Random random = new Random();
        // 2. 到MySQL中查询出当前用户的信息
        Double a = random.nextDouble();
        Double b = random.nextDouble();

        Test test = new Test();
        test.setNumber(random.nextInt(999));
        testMapper.insert(test);

        // 3. 创建坐标对象
        //Point point = new Point(a, b);

        // 4. 调用opsForGeo().add()方法，写入坐标
        // key   存储坐标的集合名（user_localtion)
        // point 坐标数据 Point
        // name  坐标对应的说明
        //redisTemplate.opsForGeo().add("user_location", point, "麦当劳");
        return "ok";
    }


    @GetMapping("/get")
    public GeoResults<RedisGeoCommands.GeoLocation<String>> testGet(Double longitude, Double latitude, Double distanceLen) {
        // 1. 确定圆心 Point
        // 参数1：longitude 经度
        // 参数2：latitude 纬度
        Point point = new Point(longitude, latitude);

        // 2. 确定查找半径 Distance
        // 参数1：数值（可以用Double类型，传小数）
        // 参数2；单位Metrics（MILES 英里 = 1.609344千米，KILOMETERS 千米）
        Distance distance = new Distance(distanceLen, Metrics.KILOMETERS);

        // 3. 画圆 Circle
        // 参数1：圆心
        // 参数2：半径
        Circle circle = new Circle(point, distance);

        // 4. 声明查询规则 RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
        // sortXX方法用来排序
        // limit方法用来设置查询条数
        RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs()
                .sortDescending()
                .limit(10)
                .includeDistance()    // 显示距离
                .includeCoordinates();  // 显示坐标

        // 5. 搜周边 radius方法
        // 参数1：key 存储坐标的集合名称
        // 参数2：circle 圆圈范围
        // 参数3：查询参数
        GeoResults results = redisTemplate.opsForGeo().radius("user_location", circle, args);

        return results;
    }
}